<?php defined('SYSPATH') or die('No direct script access.');

class Controller_Docs extends Controller_Autorization {
    //private $_data;

	public function before()
	{
		parent::before();
	}

	public function after()
	{
		parent::after();
	}

	private function autocomplete($prefix, $count)
	{
		$results = array();
		$rangeLen = 50;
		$start = $this->r->zRank(':compl', $prefix);
		if(!$start)
		{
			return $results;
		}

		while(count($results) != $count)
		{
			$range = $this->r->zRange(':compl', $start, $start+$rangeLen-1);
			$start += $rangeLen;
			if(!$range OR count($range) == 0)
			{
				break;
			}
			foreach($range as &$entry)
			{
				$minLen = min(strlen($entry), strlen($prefix));
				if(substr($entry, 0, $minLen) !=  substr($prefix, 0, $minLen))
				{
					$count = count($results);
				}
				if(substr($entry, -1) == '*' AND count($results) != $count)
				{
					$results[] = substr($entry, 0, -1);
				}
			}
		}
		return $results;
	}


	public function action_index()
	{
		$this->body();
	}

	public function action_upload()
	{		$this->body();	}

	public function action_searchlist()
	{
		//$cards = $this->r->zRange('cards:lookup:date-in',0,50);


		$arr = $this->r->zRevRangeByScore('cards:lookup:date-in', 2000000000, 1000000000, array('withscores' => TRUE, 'limit' => array(0, 50)));
        //print_r($arr);
        foreach($arr as $k=>&$v)
        {        	$this->_data['cards'][$v][$k] = json_decode($this->r->get('cards:'.$k),TRUE);        }

		$this->body();
	}

	public function action_registration()
	{
		// если метод запроса POST и выполненн с использованием AJAX
		if ($this->request->method() == Request::POST AND $this->request->is_ajax())
		{			// проверяем полученные данные
			$post = Validation::factory($_POST);
			$post->rule('last_id', 'Valid::digit');
			$post->rule('type', 'Valid::digit');
			//$post->rule('saved', 'Valid::digit');
			//$file->rule('last_id', 'Upload::not_empty');
			//$file->rule('fileupload', 'Upload::valid');

			// если проверка пройдена и card_id пустой (первое сохранение)
			if ($post->check() AND empty($post['cards_id']))
			{
				// увеличиваем на ++ 'card:last-card-id'
				$card_id = $this->r->incr('cards:last-card-id');
				// если существуют временные файлы для текущей карточки то перемещаем их
				if ((int)$this->r->lSize('tmp:cards:'.$post['last_id'].'_filename')>0)
				{
					$files = $this->r->lRange('tmp:cards:'.$post['last_id'].'_filename', 0, -1);

					foreach($files as &$file)
					{
						$newfile = date('Y').'_'.$card_id.'_'.$this->user->id.'_'.strtolower(pathinfo($file, PATHINFO_BASENAME));
						// upload/2012/idкарточки/idдокумента-idпользователя
						$dir = DOCROOT.Upload::$default_directory.DIRECTORY_SEPARATOR.date('Y').DIRECTORY_SEPARATOR.$card_id;
		            	if (!is_dir($dir))
		            	{
		            		mkdir($dir,0644,TRUE);
		            	}
		            	//echo $file.PHP_EOL.' - '.$dir.DIRECTORY_SEPARATOR.$newfile.PHP_EOL;
						//rename($file, $dir.DIRECTORY_SEPARATOR.$newfile);
						$this->r->rPush('cards:'.$card_id.'_files', DIRECTORY_SEPARATOR.date('Y').DIRECTORY_SEPARATOR.$card_id.DIRECTORY_SEPARATOR.$newfile);					}
					$this->r->del('tmp:cards:'.$post['last_id'].'_filename');
                }
                $multi = $this->r->multi();
                //print_r($post->as_array());
                // заносим все переданные значения в карточку
				foreach($post->as_array() as $k=>$v)
				{
					list(,$key) = explode('_',$k);
					if ($k=='last_id')
					{						$v = $card_id;					}
					if (!empty($v))
					{
						$v = UTF8::trim($v);
						$info[$key] = $v;
						// если текстовая строка, добавляем индексацию для поиска
						if (substr($key,0,4)=='txt-')
						{
							foreach(Stemmer::prepare($v) as $word)
							{
								$multi->sAdd('cards:searchindex:'.$key.':'.$word,$card_id);
							}
						}
						// если дата, добавляем в индекс для поиска по дате
						elseif (substr($key,0,5)=='date-')
						{
							$date = explode('.',$v);
							$multi->zAdd('cards:lookup:'.$key,mktime(0,0,0,$date[0],$date[1],$date[2]),$card_id);
						}
						// если тип, добавляем в индекс для поиска по типу
						elseif ($key=='type')
						{
							$multi->hSet('cards:lookup:'.$key,$v,$card_id);
						}
					}
				}
				//print_r($info);
				$multi->set('cards:'.$card_id,json_encode($info));
            }
            // если card_id существует (повторное сохранение)
            elseif ($post->check() AND !empty($post['cards_id']))
            {				$multi = $this->r->multi();
				foreach($post->as_array() as $k=>$v)
				{
					list(,$key) = explode('_',$k);
					if (!empty($v))
					{
						$v = UTF8::trim($v);
						$info[$key] = $v;
						//echo $key.' - '.substr($key,0,4).PHP_EOL;
						// если текстовая строка, добавляем индексацию для поиска
						if (substr($key,0,4)=='txt-')
						{
							foreach(Stemmer::prepare($v) as $word)
							{
								$multi->sAdd('cards:searchindex:'.$key.':'.$word,$post['cards_id']);
							}
						}
						// если дата, добавляем в индекс для поиска по дате
						elseif (substr($key,0,5)=='date-')
						{
							$date = explode('.',$v);
							$multi->zAdd('cards:lookup:'.$key,mktime(0,0,0,$date[1],$date[0],$date[2]),$post['cards_id']);
						}
						// если тип, добавляем в индекс для поиска по типу
						elseif ($key=='type')
						{
							$multi->hSet('cards:lookup:'.$key,$v,$post['cards_id']);
						}
					}
				}
				//print_r($info);
				$multi->set('cards:'.(int)(!empty($post['cards_id'])?$post['cards_id']:$card_id),json_encode($info));
            }
			$multi->exec();

            //$card_id = $this->r->get('cards:last-card-id');

			$this->response->body(json_encode(array('status'=>1,'cards_id'=>(int)(!empty($post['cards_id'])?$post['cards_id']:$card_id))));
		}
		else
		{
			$this->_data['last_card_id'] = $this->r->incr('tmp:last-card-id');
			//$last_file_id = $r->incr('tmp:last-file-id');
			$header = View::factory('upload/upload_header',$this->_data);
			$body = View::factory('upload/upload',$this->_data);
			$footer = View::factory('upload/upload_footer',$this->_data);
			$this->response->body($header.$body.$footer);
		}
	}

	public function action_fileupload()
	{		//echo $this->request->method();
		if ($this->request->method() == Request::GET AND !empty($_POST))
		{
			$post = Validation::factory($_POST);
			//$file = Validation::factory($_FILES);
/*	        $filetype = array(
	        	'jpg',
	        	'jpeg',
	        	'png',
	        	'gif',
	        	'bmp',
	        	'xls',
	        	'doc',
	        	'xlsx',
	        	'docx',
	        	'rar',
	        	'zip',
	        	'pdf',
	        );

			$file->rule('fileupload', 'Upload::type', array(':value', $filetype));
			$file->rule('fileupload', 'Upload::size', array(':value', '20M'));
			$file->rule('fileupload', 'Upload::not_empty');
			$file->rule('fileupload', 'Upload::valid');
*/
			$post->rule('last_id', 'Valid::not_empty')
				->rule('last_id', 'Valid::digit')
				->rule('fileupload_name', 'Valid::not_empty')
				->rule('fileupload_path', 'Valid::not_empty')
				->rule('fileupload_size', 'Valid::digit')
				->rule('fileupload_md5', 'Valid::not_empty')
				->rule('fileupload_md5', 'Valid::exact_length', array(':value', 32));
			//echo UTF8::strlen($post['fileupload_md5']);
/*
		[fileupload_name] => doc03158220121008164211.pdf
		[fileupload_content_type] => application/pdf
		[fileupload_path] => /var/tmp/nginx/fileuploads/6/0000000006
		[fileupload_md5] => 7cea0603d079317181238f018a14d7ba
		[fileupload_size] => 570927
		[last_id] => 1

			print_r($_POST);
*/			if ($post->check()/* AND $file->check() */)
			{				//echo 'ok';
				// the request is valid, do your processing

				// save the uploaded file with the name 'form' to our destination
				//$encrypt = Encrypt::instance();
				$dir = Upload::$default_directory.DIRECTORY_SEPARATOR.'tmp';
	            if (!is_dir($dir))
	            {	            	mkdir($dir,0644,TRUE);	            }
				//$ext = Upload::type($file['fileupload'],$filetype);
				//$ext = strtolower(pathinfo($post['fileupload_name'], PATHINFO_EXTENSION));
				// upload/2012/idкарточки/idдокумента-idпользователя
				//$file['name'] = $post['fileupload_name'];
				//$file['tmp_name'] = $post['fileupload_path'];
				//$filename = $post['fileupload_path'];
				//rename($file, $dir.DIRECTORY_SEPARATOR.$newfile);
/*
				if ( $post['fileupload_path'] === false ) {
					throw new Exception( 'Unable to save uploaded file!');
				}
				else
				{
*/
				$last_card_id = $this->r->get('tmp:last-card-id');
				//$last_file_id = $this->r->incr('tmp:last-file-id');
				$this->r->rPush('tmp:cards:'.$post['last_id'].'_filename',$post['fileupload_path']);
				$this->r->set('tmp:cards:'.$post['last_id'].'_lastactivity',time());/*
				}
*/
			}

		}
/*
		echo 'upl';
		echo '<pre>';
		print_r($_FILES);
		print_r($_POST);
		echo '</pre>';
*/	}

	public function action_test()
	{
		exit($this->a1->hash_password('asd__jkl'));
		$user = array(
			'email'=>'root@ctechnologies.ru',
			'username'=>'root',
			'password'=>'eb4a6ab305beb266d79696163b761e790bb7cd5cb5fe05a3f52658128beec5b0',
			'logins'=>0,
			'last_login'=>0,
			'last_uri'=>'',
			'id_location'=>0,
		);
		$this->r->del('users_last_id');
		$this->r->del('users:1');
		$this->r->hDel('users:lookup:username','root');
		$this->r->hDel('users:lookup:email','root@ctechnologies.ru');
		$id = $this->r->incr('users_last_id');
		$user['id'] = $id;
		$this->r->set('users:'.$user['id'],json_encode($user));
		$this->r->hSet('users:lookup:username',$user['username'],$user['id']);
		$this->r->hSet('users:lookup:email',$user['email'],$user['id']);
		unset($user);
		$username = 'root';
		if ($user_id = $this->r->hGet('users:lookup:username',$username))
		{			echo 'exists '.$user_id;
			$user = json_decode($this->r->get('users:'.$user_id));
			//print_r($user);
			echo $user->username;		}
		else
		{			echo 'not found';		}

		exit();

		//echo implode(PHP_EOL,range('a','z')).PHP_EOL.implode(PHP_EOL,range(0,9));
		$arr = $this->r->keys('cards:*');
		print_r($arr);

		$body = '';
/*
		for($i=1;$i<100;$i++)
		{
			//$this->r->rPush('tmp:newusers',Text::random('distinct'));
		}
		$keys = $this->r->lRange('tmp:newusers',0,50);
*/
		//print_r($keys);
		$user = array(
			'id'=>9012,
			'name'=>'Иван Федорович Петров',
			'company'=>'ИП Петров ИФ',
			'email'=>'petrov@domain.com',
			'inn'=>3800123456,
			'files'=>array(
				'/home/uploads/9012/0001'=>'file1.pdf',
				'/home/uploads/9012/0002'=>'file2.pdf',
				'/home/uploads/9012/0003'=>'file3.pdf',
			),
		);
/*		$this->r->multi()
			->del('users:9012')
			->del('users:lookup:email')
			->del('users:lookup:inn')
			->exec();
		$this->r->multi()
			->set('users:9012',json_encode($user))
			->hSet('users:lookup:email','petrov@domain.com',9012)
			->hSet('users:lookup:inn',3800123456,9012)
			->exec();
*/
/*
		$arr = $this->r->multi()
			->set('file:1','{"title":"Договор купли-продажи автотранспрота"}')
			->set('file:2','{"title":"Договор подряда"}')
			->set('file:3','{"title":"Договор передачи прав собственности"}')
			->set('file:4','{"title":"Приказ на передачу прав собственности"}')
			->set('file:5','{"title":"Приказ о назначении директора"}')
			->set('file:6','{"title":"Договор передачи автомобиля"}')
			->sAdd('searchindex:договор',1,2,3,6)
			->sAdd('searchindex:купли',1)
			->sAdd('searchindex:продажи',1)
			->sAdd('searchindex:автотранспрота',1)
			->sAdd('searchindex:подряда',2)
			->sAdd('searchindex:передачи',3,6)
			->sAdd('searchindex:прав',3,4)
			->sAdd('searchindex:собственности',3,4)
			->sAdd('searchindex:приказ',4,5)
			->sAdd('searchindex:передачу',4)
			->sAdd('searchindex:назначении',5)
			->sAdd('searchindex:директора',5)
			->sAdd('searchindex:автомобиля',6)
			->exec();
		print_r($arr);
*/
/*
	// поиск значений, где встречаются erlang И haskell
a)  SINTER 'tag:erlang' 'tag:haskell'
    0 results
	// поиск значений, где встречаются programming И computing
b)  SINTER 'tag:programming' 'tag:computing'
    3 results: 1, 2, 3
	// поиск значений, где встречаются erlang ИЛИ haskell
c)  SUNION 'tag:erlang' 'tag:haskell'
    2 results: 2 and 3
	// поиск значений, где НЕ встречаются programming И computing
d)  SDIFF 'tag:programming' 'tag:haskell'
    2 results: 1 and 2 (haskell is excluded)
*/
/*
		$a = $this->r->sInter(array('searchindex:договор', 'searchindex:передачи'));
		$b = $this->r->sInter(array('searchindex:договор', 'searchindex:передачи', 'searchindex:собственности'));
		print_r($a);
		print_r($b);

		$multi = $this->r->multi();
		for($i=1;$i<100;$i++)
		{			$time = rand(1348410557,1351002557);
			$multi->zAdd('range', $time, date('d.m.Y H:i:s',$time));		}
		$multi->exec();

		$arr = $this->r->zRevRangeByScore('range', 1351002557, 1351002557-86400*7, array('withscores' => TRUE));//.PHP_EOL;
		print_r($arr);
		$body .= $this->r->hGet('users:lookup:email','petrov@domain.com').PHP_EOL;
		$id = $this->r->hGet('users:lookup:inn',3800123456);
		$body .= $this->r->get('users:'.$id).PHP_EOL;
		$body .= (time()-86400*30).PHP_EOL;
		$body .= time().PHP_EOL;
		$str = 'Приказ на передачу прав собственности для автомобиля';
		$words = Stemmer::prepare($str);
		echo $str.PHP_EOL.'разобрана так:'.PHP_EOL;
		print_r($words);
*/		//$body = json_encode($user);
		//echo $body;
		//$this->r->mGet()
		$this->response->headers('Content-Type', 'text/plain');
		$this->response->body($body);
	}
} // End Docs